Skip to main content

TCP Handshake


3-Way-Handshake


3-Way-Handshake란, 전송제어 프로토콜(TCP)에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정/방식이다.

쉽게 말해서 TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 확인하는 과정 이라고 할 수 있다.

3-Way-Handshake 과정을 통해 데이터를 주고받는 양 쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장 할 수 있어야하고, 실제로 데이터 전달을 시작하기 전에 한 쪽이 다른쪽이 준비되었다는 것을 알 수 있도록 한다.


3-Way-Handshake 과정


3-Way-Handshake는 클라이언트와 서버 사이에서 이루어지는데 A라는 클라이언트와 B라는 프로세스 사이의 예시를 통해 과정을 설명해본다.


먼저 포트의 상태 정보는 다음을 뜻한다.

- CLOSED: 포트가 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태

또 TCP Header 안의 플래그 정보는 다음과 같다.

- SYN (Synchroinize Sequence Number): 동기화 요청을 뜻함
- ACK (Acknowledgement Number) : 확인, 응답을 뜻함
- FIN (Finish) : 세션 연결을 종료시킬 때 사용

  1. A → B : SYN
    • 접속 요청 프로세스 A가 연결 요청 메시지 전송 (SYN)
    • 송신자가 최초로 데이터를 전송할 때 Sequence Number을 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
    • PORT 상태 - B: LISTEN, A:CLOSED
  1. B → A: SYN + ACK
    • 접속 요청을 받은 프로세스 B가 요청을 수락했으며, 접속 요청 프로세스인 A도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
    • 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송
    • PORT 상태 - B: SYN_RCV, A:CLOSED
  1. A → B: ACK
    • PORT 상태 - B: SYN_RCV, A: ESTABLISHED
    • 마지막으로 접속 요청 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
    • 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송 할 수 있음
    • PORT 상태 - B: ESTABLISHED, A: ESTABLISHED

위 과정은 다음처럼 표현 할 수 있다.

Client > Server : TCP SYN
Server > Client : TCP SYN ACK
Clinet > Server : TCP ACK

왜 SYN에 랜덤한 수를 전송할까?

연결을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용할 가능성이 존재한다.

또한 서버 측에서는 패킷의 SYN을 보고 패킷을 구부한게 되는데, 난수가 아닌 순차적인 number가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 위험이 있다.



4-Way-Handshake


3-Way-Handshake가 연결을 설정하는 과정이였다면 4-Way-Handshake는 연결을 해제하는 과정이다.

연결 해제란 서버와 상호작용을 통해 통신을 하다가 더 이상 통신을 하지 않겠다는 것을 의미한다.


4-Way-Handshake 과정


4-Way-Handshake 또한 클라이언트와 서버 사이에서 이루어지고 A라는 클라이언트와 B라는 서버를 예시로 과정을 설명한다.


  1. A → B : FIN
    • 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송
    • 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
  1. B → A: ACK
    • 프로세스 B는 일단 확인 메시지를 보내고 자신이 통신이 끝날 때 까지 기다린다 (TIME_WAIT 상태)
    • 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
    • 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다.
  1. B → A: FIN

    • 프로세스 B의 통신이 끝났으면 연결 종료 요청에 합의한다는 의미로 프로세스 A에게 FIN 플래그를 전송한다.
  2. A → B: ACK

    • 프로세스 A는 확인했다는 메시지를 전송한다.


면접에 나올 수 있는 질문


Q. 3-way-handshake란?

A. TCP 통신에서 데이터를 전송하기 위해 네트워크 연결을 확인하는 과정이다


Q. 4-way-handshake란?

A. TCP 통신에서 네트워크 연결을 해제하는 과정


Q. 왜 2-way-handshake는 불가능할까?

A. TCP는 양방향 연결이기 때문에 클라이언트가 서버에게 존재를 알리고, 서버에서도 클라이언트에게 존재를 알린 뒤 대답을 얻어야한다.
총 4단계가 필요하며 축약한 것이 3단계 이므로 2 way로는 한계가 있다.

1단계: 클라이언트가 서버에게 존재를 알린다
2단계: 서버가 클라이언트의 존재를 알았다고 대답하며 클라이언트에게 존재를 알린다
3단계: 클라이언트가 서버의 존재를 알았다고 대답한다.


Q. 3 way handshake, 4 way handshake는 필수적인 과정인가?

A. 3,4 way handshake를 통하면 여러번 패킷을 주고 받는 과정이 포함된다. 하지만 이는 신뢰성 있는 연결인 TCP 특성상 보낸 데이터를 잘 받았는지, 그에 대한 잘 받았다는 응답 역시 잘 받았는지를 양측에서 확인하는 과정이다.

이러한 과정이 없다면 통신하던 중 예기치 않게 연결이 종료될 수 있고, 이는 TCP의 신뢰성에 영향을 끼치게 되므로 TCP 통신 과정에서는 필수적이라 할 수 있다.



참고




기여자



Jongminfire

📦